Similar Question
Solution Tips
方案一: 贪心
var largestSumAfterKNegations = function(nums, k) {
// 需要知道负数和k的关系
// 如果负数个数 >= k , 找到最小的 k 个负数, 全部反转为正数
// 如果负数个数 < k, 所有的负数都先进行一次反转, 剩余的次数就去操作最接近0的那个数
const freq = new Map();
for (const num of nums) {
freq.set(num, (freq.get(num) || 0) + 1);
}
let ans = _.sum(nums);
for (let i = -100; i < 0; ++i) {
if (freq.has(i)) {
const ops = Math.min(k, freq.get(i));
ans += (-i) * ops * 2;
freq.set(i, freq.get(i) - ops);
freq.set(-i, (freq.get(-i) || 0) + ops);
k -= ops;
if (k === 0) {
break;
}
}
}
if (k > 0 && k % 2 === 1 && !freq.has(0)) {
for (let i = 1; i <= 100; ++i) {
if (freq.has(i)) {
ans -= i * 2;
break;
}
}
}
return ans;
};